/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package project2analisisnumerico.procesos;

/**
 *
 * @author vmelendez
 */
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.*;
import java.io.*;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import org.jfree.chart.ChartUtilities;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.*;
import project2analisisnumerico.main.interfaceProject;


public class Graficos {
    
    public BufferedImage _image = null ;//para la imagen en memoria
    private JFreeChart grafico ;// el grafico
    private Dimension d;//dimension del grafico
    
    private MetodosNumericos nmg;
    
    public Graficos(){
        nmg = new MetodosNumericos();
    }
    /* Crea el grafico */
    public void crearGraficoDeBarras(Dimension d, int[] v, String[] arg1, String arg2[],String[] data){
        this.d= d;          
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        //se llenan los datos
        for(int i=0; i<=v.length-1;i++){
            dataset.setValue(v[i], arg1[i], arg2[i]);
        }      
        //se crea el grafico
        grafico = ChartFactory.createBarChart3D(data[0], data[1], data[2], dataset, PlotOrientation.HORIZONTAL , true, false, true);
        //se coloca el grafico en memoria
        _image = grafico.createBufferedImage(this.d.width,this.d.height);
        System.err.println("grafico creado");     
    }
    
    public void crearGraficoLineal(Dimension d, String funcion, int a, int b, String variable){
       this.d= d;
       //System.err.println("holaaa");
       if(this.nmg.validarFuncion(a, funcion, variable) != 0){
           grafico = ChartFactory.createXYLineChart(
                                                    "Funcion: " +funcion, //Titulo Grafica
                                                    "X", // Leyenda eje X
                                                    "Y", // Leyenda eje Y
                                                    this.generarDatos(funcion,a,b,variable), // Los datos
                                                    PlotOrientation.VERTICAL, //orientacion
                                                    false, // ver titulo de linea
                                                    false, //tooltips
                                                    false //URL
                                                    );
            _image = grafico.createBufferedImage(420,310);
            //System.err.println("grafico creado");
            interfaceProject.konsole.imprimirConsola("Grafico creado para la funcion: "+funcion);
       }
    } 
    
    public void crearGraficoLineal2(String funcion, String variable){
       //System.err.println("holaaa");
       if(this.nmg.validarFuncion(1, funcion, variable) != 0){
           grafico = ChartFactory.createXYLineChart(
                                                    "Funcion: " +funcion, //Titulo Grafica
                                                    "X", // Leyenda eje X
                                                    "Y", // Leyenda eje Y
                                                    this.generarDatos2(funcion,variable), // Los datos
                                                    PlotOrientation.VERTICAL, //orientacion
                                                    false, // ver titulo de linea
                                                    false, //tooltips
                                                    false //URL
                                                    );
            _image = grafico.createBufferedImage(525,270);
            //System.err.println("grafico creado");
            interfaceProject.konsole.imprimirConsola("Grafico creado para la funcion: "+funcion);
       }
    } 
    
    private XYDataset generarDatos2(String funcion, String variable){
        //le pasamos una funcion generadora f(x)
            XYSeries datos = new XYSeries("Linea Funcion");
            for(double x=-Math.PI; x<=Math.PI; x+=(Math.PI/3)) datos.add(x,this.nmg.f(x, funcion, variable));

            XYSeriesCollection conjuntoDatos = new XYSeriesCollection();
            conjuntoDatos.addSeries(datos);

            return conjuntoDatos;
    }
    
    private XYDataset generarDatos(String funcion, int a, int b, String variable){
        //le pasamos una funcion generadora f(x)
            XYSeries datos = new XYSeries("Linea Funcion");
            for(double x=a; x<=b; x+=1.0) datos.add(x,this.nmg.f(x, funcion, variable));

            XYSeriesCollection conjuntoDatos = new XYSeriesCollection();
            conjuntoDatos.addSeries(datos);

            return conjuntoDatos;
    }
    
    /* carga la imagen que esta en memoria en el objeto jLabel */
    public void cargar_grafico(JLabel lb){
        ImageIcon imagenFondo = new ImageIcon(_image);  
        lb.setIcon(imagenFondo);
        //lb.repaint();
    }  
    /* presenta la ventana de dialogo "guardar" y salva el grafico generado en JPG */
     public void Guardar(){
       JFileChooser fileChooser = new JFileChooser();
       int result = fileChooser.showSaveDialog(null);
       if ( result == JFileChooser.APPROVE_OPTION ){ 
            try{
                //se obtiene la direccion donde se guardara la imagen
                String url = fileChooser.getSelectedFile().toString();
                //Se guarda la imagen
                ChartUtilities.saveChartAsJPEG(new File(url + ".jpg"), grafico, d.width, d.height);
                interfaceProject.konsole.imprimirConsola("Imagen de grafico guardada con exito");
            }catch(IOException ex) {
                //Logger.getLogger(grafico.class.getName()).log(Level.SEVERE, null, ex);
                interfaceProject.konsole.imprimirConsola("Ocurrio un problema al guardar la imagen, intentelo mas tarde");
            }
        }
   }

}
